package com.mabs.util;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

import org.apache.commons.dbcp2.BasicDataSource;

/**
 * 本类用来演示数据源连接池
 * 使用Apache Commons-DBCP组件实现的连接池
 * 
 * C3P0,Druid...
 *
 * @author easonsy
 * 2019年8月26日 上午11:16:53
 */
public class DbcpDataSource {

	BasicDataSource dataSource = null;
	private static Properties prop;
	private static DbcpDataSource dds = new DbcpDataSource();

	static {
		try {
			prop = new Properties();
			InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("dbconfig.properties");
			prop.load(in);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private DbcpDataSource() {

	}

	public static DbcpDataSource getDataSource() {
		return dds;
	}

	/**
	 * 连接池获取连接的方法
	 */
	public Connection getConnection() throws SQLException {
		//创建Commons-DBCP连接池对象
		dataSource = new BasicDataSource();
		//设置数据源基本参数
		dataSource.setDriverClassName(prop.getProperty("jdbc.driver"));
		dataSource.setUrl(prop.getProperty("jdbc.url"));
		dataSource.setUsername(prop.getProperty("jdbc.username"));
		dataSource.setPassword(prop.getProperty("jdbc.password"));
		//设置连接池特有参数
		dataSource.setInitialSize(Integer.parseInt(prop.getProperty("jdbc.initialSize")));//初始化容量
		dataSource.setMaxTotal(Integer.parseInt(prop.getProperty("jdbc.maxTotal")));//最大活动数
		dataSource.setMaxIdle(Integer.parseInt(prop.getProperty("jdbc.maxIdle")));//最大空闲数
		dataSource.setMaxWaitMillis(Long.parseLong(prop.getProperty("jdbc.maxWaitMillis")));//最长等待时间
		return dataSource.getConnection();
	}

	/**
	 * 归还连接的方法
	 */
	public void close(Connection conn, Statement pst, ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		close(conn, pst);
	}

	public void close(Connection conn, Statement pst) {
		if (pst != null) {
			try {
				pst.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
